package com.sentinel.datasource;

import com.alibaba.csp.sentinel.datasource.Converter;
import com.alibaba.csp.sentinel.datasource.FileRefreshableDataSource;
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.fastjson.JSON;

import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * 自定义规则加载的数据
 */
public class MyDataSource implements InitFunc {
    @Override
    public void init() throws Exception {
        /*//只要将在规则的代码 放到这个init方法 就可以成为一个规则数据源
        List<FlowRule> flowRules = new ArrayList<>();
        FlowRule flowRule = new FlowRule();
        // 规则 对象 需要最少3个属性
        //绑定的资源
        flowRule.setResource("sayHi");
        //qps 角度|维度 count就是限流的阈值(上限)
        flowRule.setCount(1);
        //qps维度 0=并发维度 1=qps维度
        flowRule.setGrade(1);
        // 放到数组
        flowRules.add(flowRule);
        // 使用sentinel管理器加载这个规则
        FlowRuleManager.loadRules(flowRules);
        String json = JSON.toJSONString(flowRules);
        System.out.println(json); //输出JSON格式*/
        String file = null;
        //获取文件的全路径名称
        ClassLoader classLoader = MyDataSource.class.getClassLoader();
        URL resource = classLoader.getResource("flowRules.json");//会从类加载路径根(classpath 就是输出classes文件夹)
        file = resource.getFile(); //文本全路径
        // 读取 json文本 flowRules.json
        FileRefreshableDataSource dataSource =
                new FileRefreshableDataSource(file, new Converter() {
                    @Override
                    public Object convert(Object json) {
                        // json就是文本内容
                        String jsonStr = (String) json;
                        // 返回值就是规则数据对象<FlowRule>
                        List<FlowRule> flowRules = JSON.parseArray(jsonStr, FlowRule.class);
                        return flowRules;
                    }
                });
        //需要将这个datasource注册到sentinel
        FlowRuleManager.register2Property(dataSource.getProperty());
        System.out.println("sentinel规则加载完毕");
    }
}
